// 导入Vue
import Vue from 'vue';
// 导入Vuex
import Vuex from 'vuex';
// 使用 Vuex
Vue.use(Vuex);

// API地址
const _URL = 'https://api.wulv5.com/music';

// 导出 store 模块
export default new Vuex.Store({
    state: {
        // 创建并返回内部 audio 上下文 innerAudioContext 对象
        audio: uni.createInnerAudioContext(),
		// 播放栏数据对象 {name, artist, cover, album}
        playBarData: {},
        // 当前播放状态, 默认不播放
        playing: false,
        // 歌词, {''}
        lyricData: {},
        // 播放历史记录, [{audioSrc, audioDetail, audioLyric, id}, {}, {}...]
        playHistoryData: [],
        // 播放模式
        /* 
        single  单曲循环
        list    顺序播放
        random  随机播放
        */
        playMode: 'list',
        // 当前播放的音频在播放历史中的位置
        playIndex: 0
    },
    mutations: {
        // 播放音频
        playAudio(state) {
			state.audio.play();
            state.playing = true;
            console.log(state.playing ? '播放中...' : '已暂停');
        },
        // 暂停音频
		pauseAudio(state) {
			state.audio.pause();
            state.playing = false;
            console.log(state.playing ? '播放中...' : '已暂停');
		},
		// 设定音频播放源地址
		setAudioSrc(state, src) {
			state.audio.src = src;
			state.audio.play();
            state.playing = true;
        },
        // 设定播放底栏相关数据, {name: 歌曲名, artist: 艺人名, cover: 封面地址, album: 专辑封面}
        setPlayBarData(state, songDetail) {
            Vue.set(state.playBarData, 'name', songDetail.name);
            Vue.set(state.playBarData, 'artist', songDetail.ar[0].name);
            Vue.set(state.playBarData, 'cover', songDetail.al.picUrl);
            Vue.set(state.playBarData, 'album', songDetail.al.name);
        },
        // 设定歌词数据
        setLyric(state, lyric) {
            Vue.set(state.lyricData, 'lyric', lyric);
        },
        // push 播放历史数据
        addPlayHistoryData(state, data) {
            // 在push前通过传过来的歌曲ID判断此首歌曲是否已经存在于播放历史记录, 返回-1表示没有找到
            if (state.playHistoryData.findIndex(item => item.id === data[3]) === -1) {
                // 没有找到的话就从数组的前面插入数据
                state.playHistoryData.unshift({
                    audioSrc: data[0],      // 歌曲源地址
                    audioDetail: data[1],   // 歌曲详情
                    audioLyric: data[2],    // 歌曲歌词
                    id: data[3]        // 歌曲ID
                })
            }
            //console.log('播放历史数据', state.playHistoryData);
        },
        // 播放模式按键循环选择模式
        setPlayMode(state) {
            switch(state.playMode){
                case 'single' :
                    state.playMode = 'list';
                    break;
                case 'list' :
                    state.playMode = 'random';
                    break;
                case 'random':
                    state.playMode = 'single';
                    break;
                default:
                    console.log('播放模式数据错误!');
                    break;
            }
            console.log('已切换播放模式为: ', state.playMode);
        },
        // 设定当前要播放播放历史中的哪一首歌曲
        setPlayIndex(state, index) {
            state.playIndex = index;
            console.log('已经设定接下来播放第', state.playIndex, '首音乐');
        }
    },
    actions: {
		// search页面点击搜索结果会触发 getAudioData 函数
        getAudioData({ commit }, song) {

            Promise.all([
                // 根据 歌曲ID 请求歌曲信息, 返回歌曲文件的源地址 , 设定 audio 的源地址
                new Promise((next, err) => {
                    uni.request({
                        url: `${_URL}/song/url?id=${song.id}`,
                        method: 'GET',
                        success: res => {
                            //console.log(res);
                            // commit setAudioSrc
                            commit('setAudioSrc', res.data.data[0].url);
                            // 传递数据给下一级 Promise
                            next(res.data.data[0].url);
                        },
                        fail: () => {
                            console.log('请求资源失败 - 请求歌曲源地址错误!');
                        }
                    });
                }),
                // 根据 歌曲ID 请求歌曲详情, 返回歌曲详情 对象, 设定播放底栏相关数据, {name: 歌曲名, artist: 艺人名, cover: 封面地址, album: 专辑封面}
                new Promise((next, err) => {
                    uni.request({
                        url: `${_URL}/song/detail?ids=${song.id}`,
                        method: 'GET',
                        success: res => {
                            //console.log(res);
                            // commit setPlayBarData
                            commit('setPlayBarData', res.data.songs[0]);
                            next(res.data.songs[0]);
                        },
                        fail: () => {console.log('请求资源失败 - 获取歌曲详情错误!')}
                    });
                }),
                // 根据 歌曲ID 请求歌曲歌词, 返回歌词 字符串, 设定歌词数据
                new Promise((next, err) => {
                    uni.request({
                        url: `${_URL}/lyric?id=${song.id}`,
                        method: 'GET',
                        success: res => {
                            // commit setLyric
                            commit('setLyric', res.data.lrc.lyric);
                            next(res.data.lrc.lyric);
                        },
                        fail: () => { console.log('请求资源失败 - 获取歌曲歌词错误!')}
                    });
                })
            ]).then(function (data) {
                console.log('所有资源已请求成功!');
                // 追加一项 歌曲ID 到返回 数组 中, 用来判断此首歌曲是否已经存在于播放历史记录
                data.push(song.id);
				commit('addPlayHistoryData', data);
            }).catch(function (err) {
                console.log('资源请求出现错误: ', err);
            })
        },
        // 根据指定的 playIndex 设定当前播放的 源地址, 歌曲详情, 歌词
        setPlayDataAndPlay({ commit, state }) {
            //console.log(this.playIndex);
            commit('setAudioSrc', state.playHistoryData[ state.playIndex ].audioSrc);
            commit('setPlayBarData', state.playHistoryData[ state.playIndex ].audioDetail);
            commit('setLyric', state.playHistoryData[ state.playIndex ].audioLyric);
        }
    }
});